perm filename NS2[F8,ALS] blob
sn#321378 filedate 1977-12-15 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 *
C00027 ENDMK
C⊗;
*
WMCA DC H'A' YOUR MOVE! 0
DC YRMV:
DC YRMV.
DC H'A' MUST JUMP 1
DC MJM:
DC MJM.
DC H'D' ILLEGAL MOVE 2
DC MIM:
DC MIM.
DC H'8' TOO FAR 3
DC TFM:
DC TFM.
DC H'7' MY MOVE 4
DC MYMV:
DC MYMV.
DC H'0A' TRY AGAIN! 5
DC PCMM:
DC PCMM.
DC H'D' CONTINUE JUMP 6
DC CJM:
DC CJM.
DC H'9' I WIN IN 7
DC IWIN:
DC IWIN.
DC H'B' YOU WIN IN 8
DC UWIN:
DC UWIN.
YRMV DC H'0513' YOur move
DC H'0309' UR
DC H'0' SPACE
DC H'2913' MO
DC H'2F0B' VE
DC H'04' !
MJM DC H'2903' MUst jump
DC H'2107' ST
DC H'0' SPACE
DC H'1703' JU
DC H'2925' MP
DC H'04' !
MIM DC H'0127' ILlegal move
DC H'270B' LE
DC H'1B11' GA
DC H'2700' L SPACE
DC H'2913' MO
DC H'2F0B' VE
DC H'04' !
TFM DC H'0713' TO far
DC H'1300' O SPACE
DC H'1D11' FA
DC H'0904' R!
MYMV DC H'2905' MY move
DC H'0' -
DC H'2913' MO
DC H'2F0B' VE
PCMM DC H'0709' TRY AGAIN!
DC H'0500'
DC H'111B'
DC H'1101'
DC H'2B04'
CJM DC H'3113' CONTINUE JUMP
DC H'2B07'
DC H'012B'
DC H'030B'
DC H'0'
DC H'1703'
DC H'2925'
IWIN DC H'0100' I WIN IN
DC H'0D01'
DC H'2B00'
DC H'012B'
DC H'0'
UWIN DC H'0513' YOU WIN IN
DC H'0300'
DC H'0D01'
DC H'2B00'
DC H'012B'
DC H'0'
*-*-*- Read keyboard
RKB LR K,P Read keyboard
PI PUSH
LISU 2
LISL 4 SET ISAR FOR DELAY TIMER
LIS H'0'
LR S,A SET FOR MAX DELAY
RKB1 PI FCS FETCH CHARACTER
BZ RKB1 NULL INPUT?
BM RKB1 NO. DEBOUNCED INPUT?
PI POPS YES. POP RETURN ADDRESS
LR A,8 GET KEYBOARD INPUT
PK AND RETURN
*-*-*- Initial moves for black
BLKM DC B'11110000' 4 pieces
DC B'00000100' Byte 1, RF
DC B'11100000' 3 pieces
DC B'00000101' Byte 1, LF
DC B'01000000' 11-15 repeat to give
DC B'00000100' a slight preference
DC H'00'
*-*-*- Generate board image
BORD LR K,P
CLR
COM
LR 3,A REG3=FF
DCI OBJ0 BRD1 START ADDRESS
LIS H'2' FLAG FOR BOR
LR 4,A SET REG 4 = 2
LIS H'6'
BRD4 LR 0,A REG0 = 6 ROWS
BRD3 LIS H'A'
LR 1,A REG 1 = 10 LINE/ROW
BRD2 LIS H'4'
LR 2,A REG2=SQ PAIRS/ROW
BRD1 LR A,3
ST STORE IN BRD
COM
ST NEXT IS COMPL. OF FIRST
DS 2
BNZ BRD1 MORE FOR THIS ROW
DS 1 NO, ALL LINE DONE
BNZ BRD2
LR A,3 DONE A TIMES YET
COM
LR 3,A
DS 0 DEC ROW COUNT
BNZ BRD3 ALL ROWS DONE?
DS 4
BZ BRD5 BOTH OBJECTS DONE?
DCI OBJ1 NO,GET BORD2 ADDRS.
LIS H'2'
BR BRD4 REG0=2
*-*-*- Now put pieces in image
BRD5 LISU 3 Pieces are here
LIS H'1' 1 for red pieces (stored first)
LR 4,A Piece, (1 Red, 0 Black, -1 King)
DCI COL0
CLR CLEAR ACC
XM IN W/STATUS
LR 0,A
LISL O'7' Decrement and shift right
BNZ MEN1 if COL0 is FF (BLACK at bottom of scree
LISL O'0' Increment and shift left
MEN1 LIS H'3' if COL0 is 0 (Black at top of screen)
LR 1,A To count bytes
MEN2 LIS H'7'
LR 2,A To count bits
DCI TAB1 Byte location table
LR A,1 This byte number
SL 1 Locations occupy 2 bytes each
ADC
LM Get the byte location
LR QU,A and save it in Q
LM
LR QL,A
LR A,0
NS 0
BNZ MEN5 Decrement and shift right if COL0 is FF
LR A,I Increment and shift left if COL0 is 0
BR MEN4
MEN3 LR A,3
SL 1 and shift left
MEN4 LR 3,A
NI H'80' (done this way for symry
BZ MEN9
BR MEN8
MEN5 LR A,D Decrement if COL0 is FF
BR MEN7
MEN6 LR A,3
SR 1 and shift right
MEN7 LR 3,A
NI H'1'
BZ MEN9
MEN8 DCI TAB2 Relative-locations-of-squares table
LR A,2 This square
ADC
LM Get square displacement
LR DC,Q Recall the location for the input byte
ADC This is the square position
LR A,4 Identify type of piece
NS 4
BM PUTK To put down a king
LIS H'4' Prepare for a piece
LR 5,A To count lines
LI H'20' Skip the rst 4 lines (4*8)
ADC
XDC
DCI BLKP Anticipate a black piece
BZ PUTL A black piece (status bit still ok)
DCI REDP No, it's a red piece
BR PUTL
PUTK LIS H'2' Only 3 lines for a crown
LR 5,A
LIS H'8' To skip 1 line
ADC
XDC
DCI KING
PUTL LM Put loop
XDC
ST
LIS H'7' To next line on screen (less increment)
ADC
XDC
DS 5
BP PUTL Loop
MEN9 DS 2
BM ME10
LR A,0
NS 0
BNZ MEN6 Shift right if COL0 is FF
BR MEN3 Shift left if COL0 is 0
ME10 DS 1
BP MEN2
LR A,4
NS 4
BM BDEX Exit from board routine
DS 4
BP MEN1 Go round again for black pieces
LISU H'4' Get set for kings
LR A,0
NS 0
LISL H'3' Decrementing case
BNZ MEN1 Dedrement and shift right if COL0 is FF
LISL H'0' Incrementing case
BR MEN1 Increment and shift left if COL0 is 0
BDEX PK
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
* UPDATE CONTROL DATA *
*
BDAT DC H'1' FLAG SET SHORT UPDATE
DC UDIT:
DC UDIT.
DC UDIT:
DC UDIT.
* Set message length and line pointer
SEDC DCI LINE DCO TO LINE POINTER
LIS H'2'
SL 4 SET FOR SECOND LINE
ST
LR A,0
SL 4
LISL 4
LR S,A AND SET MESSAGE LENGTH
CLR CLEAR ACC
LR 1,A AND SET DEFAULT RESULT
POP AND RETURN
*-*-*- Address table for MVC*
TABL DC H'0C30'
DC H'0C80'
DC H'0CD0'
DC H'0D20'
DC H'0D70'
DC H'0DC0'
DC H'0F10'
DC H'0F60'
*-*-*- To move cursor, uses
*SC0,1,2,3,4,HU,Q,K,W, SC20-24.
CURS LR K,P
PI PUSH AND PUSH IT ON TO STACK
MAP0 PI MWAD WAIT, THEN UPDATE
LIS H'1' CAN START JOYREAD
LR HU,A SET FOR HORIZONTAL POT
PI JOYI AND READ
LR VX,A SAVE RESULT IN VX
LIS H'0'
LR HU,A SET FOR VERTICAL POT
PI JOYI
LR 0,A SAVE IN REG 0
PI AMAP CONVERT TO PROPER VELOCITY
LR VY,A SAVE RESULT
LR A,VX
LR 0,A NOW GET UNCOVERTED VX INTO R0
PI AMAP CONVERT IT
LR VX,A AND SAVE IT
PI MWAD WAIT, THEN UPDATE
PI BLNK To blink code (on)
LIS H'4'
LR 0,A
MP01 PI MWAD A second wait
DS 0
BNZ MP01
PI BLNK To blink code (off)
CLR CLEAR ACC
XS VX VX IN W/STATUS
BZ MAP7 NON-NULL X COMPONENT?
DCI XPOS YES
LM
LR X,A SET CURRENT X POSITION
LISU 2
LISL 0
CLR
LR I,A SP20<=0
LM
LR I,A SP21<=NON NULL LEAD MASK
LM
LR S,A SP22<=TRAILING MASK
CLR
XS VX VX IN W/STATUS
BM MAP3 GOING LEFT?
PI SHR SHIFT RIGHT ONE
LIS H'7' NO, GOING RIGHT.
XS X
BNZ MAP5 IN RH MOST BOX?
LISL 2 YES
XS S
BZ MAP5 TRIED TO GO TOO FAR?
MAP2 CLR YES.
LR VX,A CLEAR X VELOCITY
BR MAP7 AND CHECK Y
MAP3 PI SHL SHIFT LEFT ONE
CLR
XS X
BNZ MAP4 IN LH MOST BOX?
LISL 0 YES
XS S
BNZ MAP2 TRIED TO GO TOO FAR?
MAP4 LISL 0
CLR
XS S
BZ MAP7 IS SP20 NULL?
LISL 1 NO.
LR A,I
LR S,A
LISL 0
LR A,I
LR D,A
CLR
LR S,A SP22<=SP21,SP21<=SP20,SP20<=0,THAT ORDER
DS X AND DECREMENT X COUNT
BR MAP7 NOW GO CHECK Y
MAP5 LISL 1
CLR CLEAR ACC
XS S
BNZ MAP7 IS SP21=0?
LISL 2
LR A,D
LR I,A
CLR
LR D,A SP21<=SP22,SP22<=0, THAT ORDER
LIS H'1'
AS X
LR X,A INCREMENT X COUNT
MAP7 CLR
XS VY
BZ MAP9 VY=0?
DCI YPOS NO, SET DCO TO LAST Y POSITION
AM UPDATE Y COORD
BM MP7A Result Y is neg?
CI MAXY COMPARE W/MAX ALLOWED Y
BC MAP8 NEW Y>MAX ALLOWED VALUE?
MP7A CLR YES
LR VY,A RESET VY
BR MAP9
MAP8 LR Y,A SET NEW Y
MAP9 LR A,VY GET VY
SL 1
XS VX
BZ MP12 ANY MOVEMENT?
PI MVC YES, REMOVE OLD POSITION
CLR
XS VY
BZ MP10 ANY Y MOVEMENT?IF NOT, MUST HAVE VX NE 0
DCI YPOS
LR A,Y IS, SO RESET
ST Y POSITION
CLR
XS VX
BZ MP11 ANY X MOVEMENT?
MP10 DCI XPOS UPDATE X POSIT & MASK
LR A,X
ST
LISL 1
LR A,I
ST
LR A,S
ST
MP11 PI MVC DISPLAY NEW POSITION
MP12 CLR
OUTS 1 Clear port 1
NOP 3 NOP's for FCC
NOP Do not remove
NOP for any reason
INS 1 Get buttons
NI H'1' Strip to desired one
DCI BFLG To button flag
CLR
BNZ MP13 Any button input?
ST No, reset edge flag
MP14 JMP MAP0 And go try again
MP13 LR Q,DC Save address
XM Flag in W/STATUS
BNZ MP14 Previous input?
LIS H'1' No, reset flag
LR DC,Q Recover address
ST And reset
CON CLR
LR 0,A Set counter (Y conversion)
CON1 LR A,Y Get Y coordinate
CI YTST Compare W/test value
BC CON2 Y LE test value?
LR A,0 No, increment counter
INC
LR 0,A
LI -H'A'
AS Y
LR Y,A Y<=Y-H'A'
BR CON1 Go back and try agian
CON2 LR A,0 Get counter
LR Y,A Y now↑(0-7):(top-bottom)
AS X
NI H'1'
BZ MP14 On a legal square?
DCI COL0 Yes
CLR
XM Flag in W/STATUS
BP CON3 Machine plays RED?
LIS H'7' Yes
XS Y
LR Y,A Y<=7-Y
LIS H'7'
XS X
LR X,A X<=7-X
CON3 LR A,Y
SR 1
LR VY,A VY reg (BYTENO)<=(1/2*(7-Y)
DCI BYDT To BYTE data
LR A,X Get X coord.
ADC Add offset to base address
LM Get byte
LR VX,A Save byte into VX reg
DCI XOLD
LR A,X
ST
LR A,Y
ST SAVE CONVERTED CO-ORDINATES
PI MWAD WAIT, THEN UPDATE
PI ENIN ENABLE INTERRUPT DRIVEN UPDATE
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*- Data for byte values (X coord. conversions)
BYDT DC H'0880'
DC H'0440'
DC H'0220'
DC H'0110'
*-*-*- MVC Set or remove cursor
MVC LR K,P SAVE RETURN ADDRESS
DCI XPOS
LM
LR 0,A SAVE X IN R0
LISU 2
LISL 3
LM
LR I,A
LM
LR D,A LEAD IN SP23,TRAIL IN SP24
CI YPOS
LM GET Y COORDINATE
DCI H'0C30' DCO TO OBJ0 BASE ADDRESS
ADC ADD 8 X Y COORD (W/MAX FOR Y
ADC OVER H'40', CANNOT USE "CUTE"
ADC TRICKS HERE--AND FOR SPEED,
ADC WE JUST USE STRAIGHT ADC'S).
ADC
ADC
ADC
ADC
LR A,0 GET X OFFSET
ADC AND ADD IT IN
LIS CHT
LR 0,A SET COUNT FOR TRANSFER
MVC1 LR Q,DC SAVE ADDRESS IN Q REG
LR A,QU GET HO ADDRESS
CI H'E'
BNZ MVC2 AT BOTTOM OF OBJ0
LR A,QL DEFINITELY.
CI H'F'
BC MVC2 PAST BOTTOM?
LIS H'F' YES.
LR QU,A RESET HO ADDRESS
LR DC,Q AND RESET DCO ACCORDINGLY (FOR OBJ1)
MVC2 LR A,I GET LEAD MASK BYTE
LR Q,DC SAVE DCO
XM XOR IN CURSOR
LR DC,Q RECOVER ADDRESS
ST AND RESET THAT BYTE
LR Q,DC SAVE ADDRESS AGAIN
LR A,D GET TRAILING MASK BYTE
XM XOR IN BITS
LR DC,Q RECOVER ADDRESS
ST AND RESET DATA
LIS H'6'
ADC SET TO NEXT DESTINATION
DS 0 DECREMENT COUNTER
BNZ MVC1 DONE?
PK YES, RETURN
*-*-*- AMAP Mapping joystick readings to velocities
AMAP LR A,0 GET READING
CI H'40'
BNC AMP1 VAL LE H'40'?
LI H'FF' YES.
BR AMP2
AMP1 CI H'C0'
CLR
BC AMP2 VAL GT H'C0'=D'192'
LIS H'1' YES, VELOCITY = 1
AMP2 POP RETURN
*-*-*- BLNK Blinking routine
BLNK LR K,P
DCI BLNF Test BLINK flag
CLR
XM
BZ BLN4 Need to blink?
LISU 2
LISL 3
LM Yes
LR I,A Get X value
LM
LR D,A and Y value to blink
DCI COL0
CLR
XM
BZ BLN0 Need to reverse?
LIS H'7'
XS S
LR I,A
LIS H'7'
XS S
LR D,A
BLN0 DCI H'0C30'-H'50' DC0 TO OBJ0-H'50'
LISL 4
LIS H'5'
SL 4
BLN1 ADC Add off-set
DS S
BP BLN1 Added enough?
LR Q,DC Yes
LR A,QU Get H0 address
CI H'E'
BNZ BLN2 Need reset?
LIS H'F' Yes
LR QU,A
BLN2 LR DC,Q
LISL 3
LR A,S
ADC Add off-set
LIS H'3'
LR 0,A Set counter
BLN3 LR Q,DC
LI H'C0'
XM
LR DC,Q